/**
 * @file types.h
 * @copyright Copyright (c) 2021, Southwest Research Institute
 *
 * @par License
 * Software License Agreement (Apache License)
 * @par
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * @par
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#pragma once

#include <Eigen/Geometry>
#include <memory>
#include <vector>

namespace noether
{
    /** @brief A point on a surface that makes up part of a path */
    using ToolPathWaypoint = Eigen::Isometry3d;
    // ToolPathWaypoint 是一个点，表示一个三维空间中的位置和姿态。
    // 使用 Eigen 库的 Isometry3d 类型，它包含一个 3D 位移和旋转变换（即位置 + 姿态），
    // 用于描述路径上的一个点。Isometry3d 是 Eigen 库中的一种变换类型。

    /** @brief A set of contiguous waypoints that lie on the same line created by a "slice" through a
     * surface */
    using ToolPathSegment = std::vector<Eigen::Isometry3d, Eigen::aligned_allocator<Eigen::Isometry3d>>;
    // ToolPathSegment 是一组连续的 ToolPathWaypoint（即 Isometry3d 对象）。
    // 它表示沿着某个切片（slice）切过表面后，路径上沿直线排列的一系列点。
    // std::vector 用于存储这些点，且指定了 Eigen::aligned_allocator 来确保对齐，以避免 Eigen 库中可能出现的内存对齐问题。

    /** @brief A set of tool path segments that lie on the same line created by a tool path "slice",
     * but are not connected (e.g. due to a hole in the mesh) */
    using ToolPath = std::vector<ToolPathSegment>;
    // ToolPath 是多个 ToolPathSegment 的集合。一个 ToolPath 是由多个片段组成的路径，每个片段是连续的点的集合。
    // 这些片段位于同一条直线上，但它们可能不相连（例如，由于网格中的孔洞）。

    /** @brief A set of tool paths (i.e. rasters) generated by various slices through a surface */
    using ToolPaths = std::vector<ToolPath>;
    // ToolPaths 是多个 ToolPath 的集合，表示从不同的切片生成的多个路径（可以看作是通过不同角度切过表面得到的多条路径）。
    // 它代表了多个切片在表面上生成的所有工具路径（类似于图形学中的光栅化过程）。

}  // namespace noether

